import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent

"""
1. 使用requests库发送HTTP请求，获取豆瓣电影排行榜页面的HTML内容。
2. 使用BeautifulSoup解析HTML内容，提取出每部电影的名称、链接和评分。
3. 将提取的数据打印出来，包括电影名称、链接和评分。
4. 支持分页爬取，通过设置页数来爬取多页数据。
5. 使用代理IP进行请求，以避免被封禁。
"""

class DoubanMovie:  # 豆瓣电影类
    def __init__(self, pages, proxies=None):  # 初始化方法
        """
        初始化DoubanMovie类

        :param pages: 要爬取的页数
        :param proxies: 代理IP字典，格式为{'http': 'http://your_proxy', 'https': 'https://your_proxy'}
        """
        self.base_url = 'https://movie.douban.com/top250'
        self.headers = {
            'User-Agent': UserAgent().safari
        }
        self.pages = pages
        self.proxies = proxies

    def fetch_douban_top_movies(self):
        """
        获取豆瓣电影排行榜数据
        """
        for page in range(self.pages):
            start = page * 25  # 每页有25部电影
            url = f'{self.base_url}?start={start}'
            try:
                response = requests.get(url, headers=self.headers, timeout=10, proxies=self.proxies)  # 设置超时时间为10秒，并使用代理IP
                # 判断请求是否成功
                if response.status_code == 200:  # 200表示请求成功
                    soup = BeautifulSoup(response.text, 'html.parser')  # 解析HTML
                    movie_list = soup.find_all('div', class_='info')
                    print(f'第{page + 1}页共找到{len(movie_list)}部电影')
                    for movie in movie_list:
                        title = movie.find('span', class_='title').text.strip()
                        link = movie.find('a')['href']
                        rating = movie.find('span', class_='rating_num').text if movie.find('span', class_='rating_num') else '无评分'
                        print(f'电影名称: {title}, 链接: {link}, 评分: {rating}')
                else:
                    print(f'Failed to retrieve the webpage. Status code: {response.status_code}')
            except requests.RequestException as e:
                print(f'Error occurred during request: {e}')

    def start(self):
        """
        启动爬虫
        """
        self.fetch_douban_top_movies()
        print('爬取完成')

# 入口
if __name__ == '__main__':
    # 设置要爬取的页数
    # 设置代理IP，格式为{'http': 'http://your_proxy', 'https': 'https://your_proxy'}
    proxies = {'https': 'https://117.187.32.75'}
    douban_movie = DoubanMovie(pages=10, proxies=proxies)
    douban_movie.start()
